/*Copyright (c) 2012 Nicolás Zalaquett

Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice
shall be included in all copies or substantial portions of
the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/
package extrae;

import java.io.FileOutputStream;
import java.io.File;
import java.io.OutputStreamWriter;
import com.thoughtworks.xstream.*;
import org.apache.commons.io.FileUtils;
import java.lang.Exception;
import javax.swing.JOptionPane;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.Serializable;
import extrae.selectorSensores.sensorAN;
import extrae.selectorSensores.sensorNodeAN;

/**
 * @author lojkoro
 */

/*Serializador: Clase para guardar y recuperar estados completos
 *del programa. Funciones auto explicativas Serializar y Deserializar.
 *generarArchivo hace una instancia de Archivo (definido más abajo) a
 *partir de las mediciones, parámetros y notas.*/
public class Serializador {
    public var archivo:Archivo=Archivo{};
    var xstream:XStream = new XStream(new DomDriver());
    public function Serializar(file:File):Boolean{
         var output =  new OutputStreamWriter (new FileOutputStream(file));
         try{
         var xml:String = xstream.toXML(archivo);
         output.write(xml, 0, xml.length());
         output.close();
         }
         catch (e:Exception)
         {
             JOptionPane.showMessageDialog(null, "{e}",
                                "{e}", JOptionPane.INFORMATION_MESSAGE);
         }

         return true;
        }
    public function Deserializar(file:File):Archivo{
        
         var xml:String="";
         xml=FileUtils.readFileToString(file);
         var arc:Archivo=xstream.fromXML(xml) as Archivo;
         return arc;
    }

    public function generarArchivo(MA:MedicionAnaloga[],MD:MedicionDigital[],PA:parametrosAnalogo,PD:parametrosDigital,TA:Integer,TD:Integer,file:File,nts:String):Void{
         var ma:MedicionAnaloga[]=[];
         var md:MedicionDigital[]=[];
         var pa:parametrosAnalogo=parametrosAnalogo{};
         var pd:parametrosDigital=parametrosDigital{};
         for (m1 in MA){
         //Esto es raro q se necesite solo para los Digitales??
         var mm1:MedicionAnaloga=MedicionAnaloga{};
         mm1.clonar(m1);
         //////////////////////////////////////////////////////
         insert m1 into ma;
         }
         for (m2 in MD){
         var mm2:MedicionDigital=MedicionDigital{};
         mm2.clonar(m2);
         insert mm2 into md;
         }
         pa.clonar(PA);
         pd.clonar(PD);
         archivo=Archivo{
             timingDIG:TD
             timingAN:TA
             MedicionesAN:ma 
             MedicionesDIG:md
             paramAN:pa
             paramDIG:pd
             notas:nts
         }
         var output =  new OutputStreamWriter (new FileOutputStream(file));
         try{
         var xml:String = xstream.toXML(archivo);
         output.write(xml, 0, xml.length());
         output.close();
         }
         catch (e:Exception)
         {
             JOptionPane.showMessageDialog(null, "{e}",
                                "{e}", JOptionPane.INFORMATION_MESSAGE);
         }

    }
}
public class Archivo extends Serializable{
   public var MedicionesAN: MedicionAnaloga[]=[];
   public var MedicionesDIG: MedicionDigital[]=[];
   public var paramDIG: parametrosDigital;
   public var paramAN: parametrosAnalogo;
   public var timingDIG: Integer;
   public var timingAN: Integer;
   public var notas:String;
}



